<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        function Person(name,age){
            this.name = name;
            this.age = age;
        }
        // __proto__ 隐式原型  = 构造函数的prototype
        // prototype 显式原型
        Person.prototype.sleep = function(){
            console.log('睡觉');
        }

        //子类 
        // [a,...b] = [1,2,3,3,3,3,3]

        function Student(gender,...args){
            this.gender = gender;
            Person.call(this,...args);

            // 在Student里边
            // student的this 指向的是Student的实例对象 
        }


        // const s1 = new Student('男','张三',18);
        // console.log(s1.age); // 18
        // // s1.sleep();// 报错 

        // console.log(s1.name);// 张三


        // const s2 = new Student('女','壮壮对长',20);
        // console.log(s2.age); // 20
        // // s2.sleep(); 报错 只能继承父类的属性
        // console.log(s2.name); // 壮壮对长


        // 构造函数本质是个函数
        // 只要是函数 可以不跟new 一起用 
        // 如果构造函数和new 一起连用 
        // this 指向的新的实例对象 

        // 如果构造函数不跟new 一起用
        // this就失去了创建对象的能力 
        // this 就不会指向新的实例对象


        // 上面我们把父类当做普通函数来调用了
        // 利用call 改变函数内部的this指向

        // 函数.call(this指向谁,参数1,....);
        // 在Student里边
            // student的this 指向的是Student的实例对象
        // Person.call(this,...args);
        // 在Person里边
            // Person的this 指向的是Student的实例对象

        // 所以 当 实例化Student的时候
        // 把person的属性和方法都给了Student的实例对象

        // s1 = new Student('男','张三',18);
        // 张三  和 18 给到的是 ...args 
        // 父类Person的name 和age 来解构 ...args
        // name 张三
        // age  18 

        // s1 通过call 把Person的this指向了自己 

        // 也就是说变成了 s1.name
        // s1.age

    </script>
</body>
</html>